package commonType

import (
	"go.mongodb.org/mongo-driver/bson/primitive"
)

type Task struct {
	ID          *primitive.ObjectID `bson:"_id,omitempty" json:"_id"`
	Name        string              `bson:"name" json:"name"`
	ApiDoc      *primitive.ObjectID `bson:"api_doc,omitempty" json:"api_doc"`
	TraceTree   TraceTree           `bson:"trace_tree" json:"trace_tree"`
	FaultConfig []FaultConfig       `bson:"fault_config" json:"fault_config"`
}

type Request struct {
	URL    string                 `bson:"url" json:"url"`
	Method string                 `bson:"method" json:"method"`
	Header map[string]string      `bson:"header" json:"header"`
	Data   map[string]interface{} `bson:"data" json:"data"`
}
type TraceTree struct {
	Nodes []Node `bson:"nodes" json:"nodes"`
	Edges []Edge `bson:"edges" json:"edges"`
}

type Node struct {
	ID           int     `bson:"id" json:"id"`
	Name         string  `bson:"name" json:"name"`
	TraceRequest Request `bson:"trace_request" json:"trace_request"`
}

type Edge struct {
	Source int `bson:"source" json:"source"`
	Target int `bson:"target" json:"target"`
}

type FaultConfig struct {
	ServiceName string  `bson:"service_name" json:"service_name"`
	FaultList   []Fault `bson:"fault_list" json:"fault_list"`
}

type Fault struct {
	ChaosType string      `bson:"chaosType" json:"chaosType"`
	Define    interface{} `bson:"define" json:"define"`
}

type ErrorResponse struct {
	Error   string `json:"error"`
	Message string `json:"message"`
}

type SuccessResponse struct {
	Status  int         `json:"status"`  // HTTP状态码
	Message string      `json:"message"` // 描述信息
	Data    interface{} `json:"data"`    // 返回的数据
}

type Record struct {
	ID        *primitive.ObjectID `bson:"_id,omitempty" json:"_id"`
	TaskID    *primitive.ObjectID `bson:"task_id" json:"task_id"`
	Executor  string              `bson:"executor" json:"executor"`
	StartTime string              `bson:"start_time" json:"start_time"`
	EndTime   string              `bson:"end_time,omitempty" json:"end_time"`
	Status    Status              `bson:"status" json:"status"`
}
type Status int

const (
	// StatusRunning 进行中
	StatusRunning Status = iota + 1
	// StatusSuccess 执行成功
	StatusSuccess
	// StatusFailed 执行失败
	StatusFailed
)

type TestMicroservice struct {
	ID         *primitive.ObjectID `json:"_id,omitempty" bson:"_id"`
	RecordID   *primitive.ObjectID `json:"record_id,omitempty" bson:"record_id"`
	Name       string              `json:"name" bson:"name"`
	TestStatus int                 `json:"testStatus" bson:"testStatus"`
	FaultList  []Fault             `bson:"fault_list" json:"fault_list"`
	Request    Request             `bson:"request" json:"request"`
}

type StoredResponse struct {
	StatusCode int                 `json:"statusCode" bson:"statusCode"`
	Headers    map[string][]string `json:"headers" bson:"headers"`
	Body       string              `json:"body" bson:"body"` // 假设响应体可以转换为字符串
}

type TestCase struct {
	ID                 *primitive.ObjectID   `json:"_id,omitempty" bson:"_id"`
	TestMicroserviceID *primitive.ObjectID   `json:"testMicroservice_id,omitempty" bson:"testMicroservice_id"`
	SelectedFaultID    int                   `json:"selectedFault_id" bson:"selectedFault_id"`
	Dependency         []*primitive.ObjectID `json:"dependency,omitempty" bson:"dependency"`
	Status             int                   `json:"status" bson:"status"`
	Response           StoredResponse        `json:"response" bson:"response"`
}
